iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0

軟體測試最怕的就是「領域知識(Domain Knowledge)缺失」。AI 模型是由語料庫訓練出來的,它懂語法,但它不懂金融法規,也不懂會計對帳原則。

在 Python 或 JavaScript 裡,原生的浮點數(Floating-Point)是遵循 IEEE 754 標準的二進位近似值。

阿姨做夢夢到的,有個新人朋友用 Copilot 寫了處理跨境電商匯率轉換的微服務。AI 爽快地用了 float 來計算美金轉台幣的匯率。結果在處理千筆訂單的小數點四捨五入時,誤差不斷累積。月底對帳,會計氣到發瘋。

在金融與電商系統裡,絕對不允許使用近似值。我們其實可以在 CI 階段,用最嚴格的 Linter 把所有的 Float 操作從商業邏輯層徹底剷除。

  1. 靜態分析:全域封殺 Float 操作
    如果你的專案是用 Python,在處理金流的 Service 目錄下,強制規定只能使用 decimal.Decimal。我們可以寫一個自訂的 AST 檢查,或是使用現成的 Linter Plugin
import ast

class FloatBanChecker(ast.NodeVisitor):
    def visit_Float(self, node):
        raise ValueError(f"警告:第 {node.lineno} 行禁止使用浮點數!錢請用 Decimal。")
        
    def visit_Call(self, node):
        if isinstance(node.func, ast.Name) and node.func.id == 'float':
            raise ValueError(f"警告:第 {node.lineno} 行禁止強制轉型為 float!")
        self.generic_visit(node)

2.動態測試:邊界值的屬性測試(Property-based Testing)
不要只寫 10 + 20 這種簡單的測項。導入 Hypothesis 這種屬性測試框架,隨機生成極端的小數點數字狂轟攻擊你的寫的算錢 Function。

from hypothesis import given
from hypothesis.strategies import decimals

@given(price=decimals(min_value="0.01", max_value="9999.99", places=2))
def test_tax_calculation_never_loses_precision(price):
    tax = calculate_tax(price)
    # 如果內部用了 float,這個斷言在遇到特定數字時一定會炸
    assert isinstance(tax, Decimal)

上一篇
AI 最愛無腦 Select All,是好事嗎
下一篇
薛丁格的綠燈,AI 寫的測試竟然會隨機 Failed,どうして
系列文
拒絕通靈測試與 AI 垃圾:SDET 的 30 天自動化防禦工事9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言